package com.atguigu.spzx.manager.controller;

import com.alibaba.fastjson.JSON;
import com.atguigu.spzx.common.log.annotations.Log;
import com.atguigu.spzx.common.log.annotations.OpratorTypeEnum;
import com.atguigu.spzx.common.util.IpUtil;
import com.atguigu.spzx.common.util.LoginAuthUtil;
import com.atguigu.spzx.manager.service.BrandService;
import com.atguigu.spzx.common.log.service.SysOperLogService;
import com.atguigu.spzx.model.entity.product.Brand;
import com.atguigu.spzx.model.entity.system.SysOperLog;
import com.atguigu.spzx.model.vo.common.Result;
import com.github.pagehelper.PageInfo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.Date;
import java.util.List;

@RestController
@Tag(name = "商品品牌管理模块")
@RequestMapping("/admin/product/brand")
public class BrandController {
    @Resource
    BrandService brandService;
    @Resource
    SysOperLogService sysOperLogService;
    @Operation(summary = "查询所有品牌")
    @GetMapping
    public Result<List<Brand>> listAll(){
        List<Brand> brands = brandService.listAll();
        return Result.ok(brands);
    }

    @Operation(summary = "删除")
    @DeleteMapping("{id}")
    @Log(title = "根据id删除品牌",businessType = 3)
    public Result deleteById(@PathVariable("id")Long id){
        brandService.deleteById(id);
        return Result.ok(null);
    }
    @Operation(summary = "根据id查询品牌")
    @Log(title = "根据id查询品牌")
    @GetMapping("{id}")
    public Result<Brand> getById(@PathVariable("id")Long id){
        Brand brand = brandService.getById(id);
        return Result.ok(brand);
    }
    @Operation(summary = "根据id更新品牌")
    @PutMapping
    public Result updateById(@RequestBody Brand brand){
       brandService.updateById(brand);
        return Result.ok(null);
    }
    @Operation(summary = "新增品牌")
    @PostMapping
    public Result save(@RequestBody Brand brand){
        brandService.save(brand);
        return Result.ok(null);
    }
    /*
        优化： 所有的Controller接口方法 都希望保存操作日志，代码冗余
            可以使用aop，将保存操作日志的代码写在通知方法内，但是每个方法名称、参数列表等各不相同
            保存日志时有需要一些参数，通知方法不便于获取一些特有参数

            解决：
                1、创建自定义注解：
                    切面类可以使用自定义注解作为切入点
                    注解中：可以携带自定义参数传给通知方法
                        > title：访问的接口标题  String
                        > isSaveRequestParams: 配置是否保存请求参数列表  （上传文件之类的无需保存参数列表）
                                    boolean
                        > isSaveResultJson: 是否保存响应数据
                                    boolean
                        > businessType: 业务类型  0 查询  ....
                                    int
                        > operatorType:  操作身份类型
                                String
                2、在需要使用保存操作日志的接口方法上使用Log注解标注 并配置
                3、使用切面类对注解赋能:
                    以注解为切入点  对目标方法进行增强(保存操作日志)
     */

    @Operation(summary = "分页查询品牌")
    @Log(title = "查询品牌分页数据",operatorType = OpratorTypeEnum.PC)
    @GetMapping("page/{pageNum}/{pageSize}")
    public Result<PageInfo<Brand>> page(@PathVariable("pageNum")Integer pageNum,
                                        @PathVariable("pageSize")Integer pageSize    ){
        PageInfo<Brand> page = brandService.getPage(pageNum,pageSize);
        //获取全局数据存储对象
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
//        //记录查询日志
//        SysOperLog sysOperLog = new SysOperLog();
//        sysOperLog.setTitle("查询品牌分页数据");//访问的接口标题
//        sysOperLog.setMethod(this.getClass().getName());//访问的模块
//        sysOperLog.setRequestMethod(request.getMethod());//请求方式
//        sysOperLog.setOperatorType("MANAGER");//操作类型
//        sysOperLog.setBusinessType(0);// 业务类型
//        sysOperLog.setOperName(LoginAuthUtil.get().getUserName());//操作管理员账号
//        sysOperLog.setOperUrl(request.getRequestURI());//接口路径
//        sysOperLog.setOperIp(IpUtil.getIpAddress(request));//客户端ip地址
//        sysOperLog.setOperParam(pageNum +" , "+ pageSize); //请求参数
//        sysOperLog.setJsonResult(JSON.toJSONString(page));//返回结果
//        sysOperLog.setStatus(0);//业务执行状态  0正常
//        sysOperLog.setErrorMsg(null);//执行状态为1时 出现异常的异常信息
//        sysOperLog.setOperTime(new Date());
//        sysOperLog.setCreateTime(new Date());
//        sysOperLog.setUpdateTime(new Date());
//        sysOperLogService.saveSysOperLog(sysOperLog);
        return Result.ok(page);
    }
}
